//package com.boot;
//
//import com.alibaba.dubbo.common.Constants;
//import com.alibaba.dubbo.common.extension.Activate;
//import com.alibaba.dubbo.common.json.JSONObject;
//import com.alibaba.dubbo.config.spring.ServiceBean;
//import com.alibaba.dubbo.rpc.*;
//import com.boot.domain.ServiceResponse;
//import org.apache.dubbo.rpc.RpcResult;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import javax.validation.ConstraintViolation;
//import javax.validation.Validation;
//import javax.validation.executable.ExecutableValidator;
//import javax.xml.ws.Response;
//import java.lang.reflect.Method;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Objects;
//import java.util.Set;
//
///**
// * @author songlin.an
// * @className DubboServiceParameterFilter
// * @description TODO
// * @date 2023/5/5 16:15
// **/
//@Activate(group = {Constants.PROVIDER}, order = 1)
//public class DubboServiceParameterFilter implements Filter {
//
//    private static final Logger logger = LoggerFactory.getLogger(DubboServiceParameterFilter.class);
//
//    private static ExecutableValidator executableValidator = Validation.buildDefaultValidatorFactory().getValidator().forExecutables();
//
//    private static final String VALIDATOR_MESSAGE = "参数验证失败";
//
//    @Override
//    public Result invoke(Invoker<?> invoker, Invocation invocation) {
//
//        logger.info("===================== param filter ========================");
//        Method method = getMethod(invoker, invocation);
//        if (Objects.nonNull(method)) {
//            Class inf = invoker.getInterface();
//            Object object = ServiceBean.getSpringContext().getBean(inf);
//            Object[] paramList = invocation.getArguments();
//            //用校验器，校验此object的method方法的paramList是否合法，返回校验结果
//            Set<ConstraintViolation<Object>> constraintViolations = executableValidator.validateParameters(object, method, paramList);
//            ServiceResponse response = getValidationResult(constraintViolations);
//            if (response.getCode().equals("401")) {
//                return new RpcResult(response);
//            }
//        }
//        return invoker.invoke(invocation);
//    }
//
//    /**
//     * 获取校验方法
//     */
//    private static Method getMethod(Invoker<?> invoker, Invocation invocation) {
//
//        Method[] methods = invoker.getInterface().getDeclaredMethods();
//        for (Method m : methods) {
//            //即获取此次dubbo invocation对应的method对象
//            boolean needCheck = m.getName().equals(invocation.getMethodName()) && invocation.getArguments().length == m.getParameterCount();
//            if (needCheck) {
//                if (matchMethod(invocation.getParameterTypes(), m.getParameterTypes())) {
//                    return m;
//                }
//            }
//        }
//        return null;
//    }
//
//    //获取匹配的方法
//    private static boolean matchMethod(Class[] invokerMethodParamClassList, Class[] matchMethodParamClassList) {
//        for (int i = 0; i < invokerMethodParamClassList.length; i++) {
//            if (!invokerMethodParamClassList[i].equals(matchMethodParamClassList[i])) {
//                return false;
//            }
//        }
//        return true;
//    }
//
//    /**
//     * 校验结果转换返回对象
//     */
//    private static <T> ServiceResponse getValidationResult(Set<ConstraintViolation<T>> set) {
//        if (set != null && !set.isEmpty()) {
//            return ServiceResponse.failureResponse("401", set.iterator().next().getMessage());
//        }
//        return ServiceResponse.success();
//    }
//}
//
